package com.smile.commons.time;

public class TimeUtils {

    /**
     * 将毫秒数转换为时分秒字符串 (自动省略0小时)
     * 示例：65000毫秒 -> "01:05" (1分5秒)
     *
     * @param milliseconds 毫秒数（必须为非负数）
     * @return 格式化字符串（分钟:秒 或 小时:分钟:秒）
     */
    public static String formatTime(long milliseconds) {
        TimeInfo info = getTimeInfo(milliseconds);
        if (info.getHours() > 0) {
            return String.format("%d:%02d:%02d", info.getHours(), info.getMinutes(), info.getSeconds());
        } else {
            return String.format("%d:%02d", info.getMinutes(), info.getSeconds());
        }
    }

    /**
     * 将毫秒数转换为固定格式的时分秒字符串 (始终显示小时)
     * 示例：65000毫秒 -> "00:01:05"
     *
     * @param milliseconds 毫秒数（必须为非负数）
     * @return 固定格式的字符串（HH:mm:ss）
     */
    public static String formatFullTime(long milliseconds) {
        TimeInfo info = getTimeInfo(milliseconds);
        return String.format("%02d:%02d:%02d", info.getHours(), info.getMinutes(), info.getSeconds());
    }

    public static void main(String[] args) {
        System.out.println(TimeUtils.toChineseTime(300000000));
    }

    /**
     * 获取时分秒明细对象
     *
     * @param milliseconds 毫秒数（必须为非负数）
     * @return 包含时分秒的TimeInfo对象
     */
    public static TimeInfo getTimeInfo(long milliseconds) {
        if (milliseconds < 0) {
            throw new IllegalArgumentException("输入必须为非负数");
        }

        long totalSeconds = milliseconds / 1000;      // 总秒数
        long seconds = totalSeconds % 60;             // 秒
        long totalMinutes = totalSeconds / 60;        // 总分钟
        long minutes = totalMinutes % 60;             // 分
        long hours = totalMinutes / 60;               // 小时

        return new TimeInfo(hours, minutes, seconds);
    }

    // 时间明细数据对象
    public static class TimeInfo {
        private final long hours;
        private final long minutes;
        private final long seconds;

        public TimeInfo(long hours, long minutes, long seconds) {
            this.hours = hours;
            this.minutes = minutes;
            this.seconds = seconds;
        }

        public long getHours() {
            return hours;
        }

        public long getMinutes() {
            return minutes;
        }

        public long getSeconds() {
            return seconds;
        }
    }

    /**
     * 将毫秒数转换为中文格式的"小时-分钟-秒"
     * 自动省略零值单位，但至少会显示秒(即使为0)
     *
     * @param milliseconds 输入毫秒数（支持负值，将转换为正值）
     * @return 格式化的时间字符串（如"3小时25分钟45秒"）
     */
    public static String toChineseTime(long milliseconds) {
        // 处理负值输入
        long absTime = Math.abs(milliseconds);

        // 计算时间单位
        long totalSeconds = absTime / 1000;
        long seconds = totalSeconds % 60;
        long totalMinutes = totalSeconds / 60;
        long minutes = totalMinutes % 60;
        long hours = totalMinutes / 60;

        // 构建字符串
        StringBuilder builder = new StringBuilder();

        if (hours > 0) {
            builder.append(hours).append("小时");
        }
        if (minutes > 0) {
            if (builder.length() > 0) builder.append("");
            builder.append(minutes).append("分钟");
        }
        if (seconds >= 0) {
            if (builder.length() > 0) builder.append("");
            builder.append(seconds).append("秒");
        }

        // 如果原始输入为负值，添加负号
        if (milliseconds < 0) {
            return "-" + builder.toString();
        }
        return builder.toString();
    }

}
